<?php
 
 // ATTENTION DANS executeSql, mis en paramètres le return --> Erreur car la requête SQL est INSERT ...

class Model {

	static $connections = array();

	public $conf = 'default';	// Nom de la bd que l'on va utiliser
	public $smtp = 'default';
	public $table = false;
	public $db;
	public $primaryKey = 'idPhoto';	// Pourra être changé en fonction de la clé primaire des tables

	public function __construct()
	{
		// J'initialise qq variables
		if($this->table === false){
			$this->table = strtolower(get_class($this)).'s';
		}
		
		// Je me connecte à la base
		$conf = Conf::$databases[$this->conf];

		// Vérification si on a pas déjà la connexion en stock
		if(isset(Model::$connections[$this->conf])) {
			$this->db = Model::$connections[$this->conf];
			return true;
		}

		try {
			$pdo = new PDO(
				'mysql:host='.$conf['host'].';dbname='.$conf['database'].';', 
				$conf['login'],
				$conf['password'],
				// On force la connexion en UTF8 (accent, etc...)
				array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
			);
			// Utile pour la phase de debug
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

			Model::$connections[$this->conf] = $pdo;
			$this->db = $pdo;
		} catch (PDOException $e) {
			if(Conf::$debug >= 1) {
				die($e->getMessage());
			}
			else {
				die('Impossible de se connecter à la base');
			}
		}

		//init conf smtp
		$smtp = Conf::$initsmtp[$this->smtp];
		foreach ($smtp as $key => $value) 
		{
			ini_set( $key, $value);
		}	
	} 

	public function find($req)
	{
		$sql = 'SELECT ';	

		// Teste si la condition est faite sur plusieurs champs
		if(isset($req['fields'])){
			if(is_array($req['fields'])){
				$sql .= implode(', ', $req['fields']);
			} else {
				$sql .= $req['fields'];
			}
		} else {
			$sql .= '*';
		}

		$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';

		// Construction de la condition
		if(isset($req['conditions'])){
			$sql .= 'WHERE ';

			if(!is_array($req['conditions'])){
				$sql .= $req['conditions'];
			} else {
				$cond = array();
				foreach($req['conditions'] as $k=>$v){
					if(!is_numeric($v)){
						$v = '"'.mysql_real_escape_string($v).'"'; 				// 38' VIDEO 3
					}					
					$cond[] = "$k=$v";
				}
				$sql .= implode(' AND ', $cond);
			}
		}

		// Modification pour l'ordre
		if(isset($req['order by'])){
			$sql .= ' ORDER BY '.$req['order by'];			
		}

		// Modification pour la pagination -- Si on détecte qu'on a une limite
		if(isset($req['limit'])){
			$sql .= ' LIMIT '.$req['limit'];			
		}
		
		$pre = $this->db->prepare($sql);
		$pre->execute();
		return $pre->fetchAll(PDO::FETCH_OBJ);
	}

	/**
	* Permet de récupérer le premier enregistrement retourné
	*/
	public function findFirst($req)
	{
		return current($this->find($req));
	}

	/**
	* Permet de récupérer le nombre d'enregistrements retournés
	*/
	public function findCount($conditions){
		$res = $this->findFirst(array(
			'fields' => 'COUNT('.$this->primaryKey.') AS count',
			'conditions' => $conditions
		));

		return $res->count;
		
	}


	//insertion d'un nouvel utilisateur dans la bd
	public function inscriptionInsert($tab, $data, $token)
	{
		
		$sql = "INSERT INTO ".$tab." VALUES ('".implode("','",$data)."')";

		$this->executeSql($sql);

		//envoie d'un mail de confirmation
		$subject = "ImagesArray confirmation d'inscription";
		$conf = Conf::$databases[$this->conf];

		$lien = 'http://88.166.137.233'.BASE_URL."/users/inscription/".$token;
		$msg = "Bonjour et bienvenue sur imagesarray.fr.\r\n Pour valider votre inscription, merci de cliquez sur ce lien :\r\n".$lien;
		$header = 'From: inscription@imagesarray.com' . "\r\n" .'Reply-To: contact@imagesarray.com';

		$this->envoieMail($data[2], $subject, $msg, $header);

	}

	public function envoieMail($to, $subject, $message, $header)
	{
		mail($to, $subject, $message, $header);
	}

	public function executeSql($_sql)
	{
		$pre = $this->db->prepare($_sql);
		if(!$pre->execute())
		{
			echo 'erreur BD';
		}
		//return $pre->fetchAll(PDO::FETCH_OBJ);
	}

	public function valideInscription($id)
	{
		//modification temp->user et du token de l'utilisateur ayant l'idMembre $id
		$token = sha1(uniqid(rand()));
		$sql = "UPDATE users SET typeMembre = 'user', token = '".$token."' WHERE idMembre = ".$id;
		$this->executeSql($sql);
	}

	//yyyy-mm--dd -> dd / mm / yyyy
	public function editDate($date)
	{
		list($y, $m, $d) = preg_split("/-/", $date);
		$date = $d.' / '.$m.' / '.$y;
		return $date;
	}

}